Trò chơi Tic-Tac-Toe, game đánh caro full source code
53.525 lượt xem;
1 using System.Collections.Generic;
2 using Assets.Scripts.Signals;
3 using UnityEngine;
4
5 namespace Assets.Scripts.Network
6 {
7 public class NetworkAdapter : Photon.MonoBehaviour, INetworkService
8 {
9 public Signal OnBeginConnectingSignal { get; private set; }
10
11 public Signal OnConnectedToMasterSignal { get; private set; }
12
13 public Signal OnDisconnectedFromMasterSignal { get; private set; }
14
15 public Signal<string> OnConnectionFailSignal { get; private set; }
16
17 public Signal OnJoinedRoomSignal { get; private set; }
18
19 public Signal OnAllPlayersConnectedSignal { get; private set; }
20
21 public Signal<Seed, int, int> OnRemoteBoardChangeSignal { get; private set; }
22
23 public Signal OnNewGameStartedSignal { get; private set; }
24
25 public string PlayerName
26 {
27 get
28 {
29 if (PhotonNetwork.connected)
30 {
31 return PhotonNetwork.playerName;
32 }
33 return PlayerPrefs.GetString("playerName", "Player" + Random.Range(1, 9999));
34 }
35 set
36 {
37 PhotonNetwork.playerName = value;
38 PlayerPrefs.SetString("playerName", PhotonNetwork.playerName);
39 }
40 }
41
42 public string OpponentName
43 {
44 get
45 {
46 if (PhotonNetwork.connected && PhotonNetwork.otherPlayers.Length > 0)
47 {
48 return PhotonNetwork.otherPlayers[0].name;
49 }
50 return "Player O";
51 }
52 }
53
54 public bool HasAllPlayers
55 {
56 get
57 {
58 return PhotonNetwork.connected && PhotonNetwork.room != null && PhotonNetwork.room.playerCount == 2;
59 }
60 }
61
62 public bool IsMaster
63 {
64 get { return PhotonNetwork.isMasterClient; }
65 }
66
67 public bool IsConnected
68 {
69 get { return PhotonNetwork.connected; }
70 }
71
72 public void Connect()
73 {
74 if (!PhotonNetwork.connected)
75 {
76 OnConnectedToMasterSignal.Dispatch();
77
78 PhotonNetwork.playerName = PlayerName;
79 PhotonNetwork.ConnectUsingSettings("v1.0");
80 }
81 else
82 {
83 OnConnectedToMaster();
84 }
85 }
86
87 public void Disconnect()
88 {
89 PhotonNetwork.Disconnect();
90 }
91
92 public void JoinRoom(string roomName)
93 {
94 PhotonNetwork.JoinRoom(roomName);
95 }
96
97 public void JoinRandomRoom()
98 {
99 PhotonNetwork.JoinRandomRoom();
100 }
101
102 public void CreateRoom(string roomName)
103 {
104 PhotonNetwork.CreateRoom(roomName, new RoomOptions() { maxPlayers = 2 }, TypedLobby.Default);
105 }
106
107 public List<string> GetRoomList()
108 {
109 List<string> list = new List<string>();
110
111 foreach (var roomInfo in PhotonNetwork.GetRoomList())
112 {
113 if (roomInfo.playerCount == 1)
114 {
115 list.Add(roomInfo.name);
116 }
117 }
118
119 return list;
120 }
121
122 public void SendNewGameStarted()
123 {
124 if (PhotonNetwork.room != null && PhotonNetwork.room.playerCount == 2)
125 {
126 photonView.RPC("OnNewGameStart", PhotonTargets.OthersBuffered);
127 }
128 }
129
130 public void SendBoardChange(Seed seed, int row, int col)
131 {
132 if (PhotonNetwork.room != null && PhotonNetwork.room.playerCount == 2)
133 {
134 photonView.RPC("OnRemoteBoardChange", PhotonTargets.OthersBuffered, (int)seed, row, col);
135 }
136 }
137
138 private void Awake()
139 {
140 OnBeginConnectingSignal = new Signal();
141 OnConnectedToMasterSignal = new Signal();
142 OnDisconnectedFromMasterSignal = new Signal();
143 OnConnectionFailSignal = new Signal<string>();
144 OnJoinedRoomSignal = new Signal();
145 OnAllPlayersConnectedSignal = new Signal();
146 OnRemoteBoardChangeSignal = new Signal<Seed, int, int>();
147 OnNewGameStartedSignal = new Signal();
148
149 ServiceLocator.AddService<INetworkService>(this);
150 }
151
152 private void OnDestroy()
153 {
154 ServiceLocator.RemoveService<INetworkService>();
155 }
156
157 private void OnConnectedToMaster()
158 {
159 OnConnectedToMasterSignal.Dispatch();
160 }
161
162 private void OnDisconnectedFromPhoton()
163 {
164 OnDisconnectedFromMasterSignal.Dispatch();
165 }
166
167 private void OnFailToConnectToPhoton()
168 {
169 OnConnectionFailSignal.Dispatch("Connection failed doe to invalid AppId or some network issues");
170 }
171
172 private void OnConnectionFail(DisconnectCause cause)
173 {
174 OnConnectionFailSignal.Dispatch("Connection failed doe to " + cause);
175 }
176
177 private void OnJoinedRoom()
178 {
179 OnJoinedRoomSignal.Dispatch();
180 CheckForAllPlayers();
181 }
182
183 private void OnPhotonPlayerConnected(PhotonPlayer player)
184 {
185 CheckForAllPlayers();
186 }
187
188 private void CheckForAllPlayers()
189 {
190 if (PhotonNetwork.room.playerCount == 2)
191 {
192 OnAllPlayersConnectedSignal.Dispatch();
193 }
194 }
195
196 private void OnPhotonPlayerDisconnected(PhotonPlayer player)
197 {
198 Disconnect();
199 }
200
201 [RPC]
202 private void OnNewGameStart()
203 {
204 OnNewGameStartedSignal.Dispatch();
205 }
206
207 [RPC]
208 private void OnRemoteBoardChange(int seed, int row, int col)
209 {
210 OnRemoteBoardChangeSignal.Dispatch((Seed)seed, row, col);
211 }
212
213 private void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
214 {
215 }
216 }
217 }
2 using Assets.Scripts.Signals;
3 using UnityEngine;
4
5 namespace Assets.Scripts.Network
6 {
7 public class NetworkAdapter : Photon.MonoBehaviour, INetworkService
8 {
9 public Signal OnBeginConnectingSignal { get; private set; }
10
11 public Signal OnConnectedToMasterSignal { get; private set; }
12
13 public Signal OnDisconnectedFromMasterSignal { get; private set; }
14
15 public Signal<string> OnConnectionFailSignal { get; private set; }
16
17 public Signal OnJoinedRoomSignal { get; private set; }
18
19 public Signal OnAllPlayersConnectedSignal { get; private set; }
20
21 public Signal<Seed, int, int> OnRemoteBoardChangeSignal { get; private set; }
22
23 public Signal OnNewGameStartedSignal { get; private set; }
24
25 public string PlayerName
26 {
27 get
28 {
29 if (PhotonNetwork.connected)
30 {
31 return PhotonNetwork.playerName;
32 }
33 return PlayerPrefs.GetString("playerName", "Player" + Random.Range(1, 9999));
34 }
35 set
36 {
37 PhotonNetwork.playerName = value;
38 PlayerPrefs.SetString("playerName", PhotonNetwork.playerName);
39 }
40 }
41
42 public string OpponentName
43 {
44 get
45 {
46 if (PhotonNetwork.connected && PhotonNetwork.otherPlayers.Length > 0)
47 {
48 return PhotonNetwork.otherPlayers[0].name;
49 }
50 return "Player O";
51 }
52 }
53
54 public bool HasAllPlayers
55 {
56 get
57 {
58 return PhotonNetwork.connected && PhotonNetwork.room != null && PhotonNetwork.room.playerCount == 2;
59 }
60 }
61
62 public bool IsMaster
63 {
64 get { return PhotonNetwork.isMasterClient; }
65 }
66
67 public bool IsConnected
68 {
69 get { return PhotonNetwork.connected; }
70 }
71
72 public void Connect()
73 {
74 if (!PhotonNetwork.connected)
75 {
76 OnConnectedToMasterSignal.Dispatch();
77
78 PhotonNetwork.playerName = PlayerName;
79 PhotonNetwork.ConnectUsingSettings("v1.0");
80 }
81 else
82 {
83 OnConnectedToMaster();
84 }
85 }
86
87 public void Disconnect()
88 {
89 PhotonNetwork.Disconnect();
90 }
91
92 public void JoinRoom(string roomName)
93 {
94 PhotonNetwork.JoinRoom(roomName);
95 }
96
97 public void JoinRandomRoom()
98 {
99 PhotonNetwork.JoinRandomRoom();
100 }
101
102 public void CreateRoom(string roomName)
103 {
104 PhotonNetwork.CreateRoom(roomName, new RoomOptions() { maxPlayers = 2 }, TypedLobby.Default);
105 }
106
107 public List<string> GetRoomList()
108 {
109 List<string> list = new List<string>();
110
111 foreach (var roomInfo in PhotonNetwork.GetRoomList())
112 {
113 if (roomInfo.playerCount == 1)
114 {
115 list.Add(roomInfo.name);
116 }
117 }
118
119 return list;
120 }
121
122 public void SendNewGameStarted()
123 {
124 if (PhotonNetwork.room != null && PhotonNetwork.room.playerCount == 2)
125 {
126 photonView.RPC("OnNewGameStart", PhotonTargets.OthersBuffered);
127 }
128 }
129
130 public void SendBoardChange(Seed seed, int row, int col)
131 {
132 if (PhotonNetwork.room != null && PhotonNetwork.room.playerCount == 2)
133 {
134 photonView.RPC("OnRemoteBoardChange", PhotonTargets.OthersBuffered, (int)seed, row, col);
135 }
136 }
137
138 private void Awake()
139 {
140 OnBeginConnectingSignal = new Signal();
141 OnConnectedToMasterSignal = new Signal();
142 OnDisconnectedFromMasterSignal = new Signal();
143 OnConnectionFailSignal = new Signal<string>();
144 OnJoinedRoomSignal = new Signal();
145 OnAllPlayersConnectedSignal = new Signal();
146 OnRemoteBoardChangeSignal = new Signal<Seed, int, int>();
147 OnNewGameStartedSignal = new Signal();
148
149 ServiceLocator.AddService<INetworkService>(this);
150 }
151
152 private void OnDestroy()
153 {
154 ServiceLocator.RemoveService<INetworkService>();
155 }
156
157 private void OnConnectedToMaster()
158 {
159 OnConnectedToMasterSignal.Dispatch();
160 }
161
162 private void OnDisconnectedFromPhoton()
163 {
164 OnDisconnectedFromMasterSignal.Dispatch();
165 }
166
167 private void OnFailToConnectToPhoton()
168 {
169 OnConnectionFailSignal.Dispatch("Connection failed doe to invalid AppId or some network issues");
170 }
171
172 private void OnConnectionFail(DisconnectCause cause)
173 {
174 OnConnectionFailSignal.Dispatch("Connection failed doe to " + cause);
175 }
176
177 private void OnJoinedRoom()
178 {
179 OnJoinedRoomSignal.Dispatch();
180 CheckForAllPlayers();
181 }
182
183 private void OnPhotonPlayerConnected(PhotonPlayer player)
184 {
185 CheckForAllPlayers();
186 }
187
188 private void CheckForAllPlayers()
189 {
190 if (PhotonNetwork.room.playerCount == 2)
191 {
192 OnAllPlayersConnectedSignal.Dispatch();
193 }
194 }
195
196 private void OnPhotonPlayerDisconnected(PhotonPlayer player)
197 {
198 Disconnect();
199 }
200
201 [RPC]
202 private void OnNewGameStart()
203 {
204 OnNewGameStartedSignal.Dispatch();
205 }
206
207 [RPC]
208 private void OnRemoteBoardChange(int seed, int row, int col)
209 {
210 OnRemoteBoardChangeSignal.Dispatch((Seed)seed, row, col);
211 }
212
213 private void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
214 {
215 }
216 }
217 }